package Mail_Server;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 *
 * @author altra
 */
public class xFichero implements java.io.Serializable {

    private JFileChooser fileChooser;
    //private FileNameExtensionFilter filter = new FileNameExtensionFilter("sever1","txt");
    private File file = null;
    private boolean isopen = true;//bandera de control para saber si se abrio un archivo
    private ArrayList contenido = new ArrayList();//almacena los registros leidos de *.txt

    //Constructor de clase
    public xFichero() {
    }

    public boolean registrar_cliente(String nombreUsuario, String nombreServer) throws IOException {

        Abrir(nombreServer);
        if (Actualizar_cliente(nombreUsuario)) {
            return true;
        }
        return false;
    }

    //Retorna el nombre del archivo abierto
    public String getFileName() {
        if (file != null) {
            return file.getName();
        } else {
            return "Sin Titulo";
        }
    }

    /* Abre la cja de dialogo Guardar como
     52  Input: String de la forma "campo1,campo2,campo3"
     53  */
    public void GuardarComo(String texto) {
        fileChooser = new JFileChooser();
        int result = fileChooser.showSaveDialog(null);
        if (result == JFileChooser.APPROVE_OPTION) {
            this.isopen = true;
            this.contenido.clear();
            if (escribir(fileChooser.getSelectedFile(), texto)) {
                JOptionPane.showMessageDialog(null, "Archivo '" + fileChooser.getSelectedFile().getName() + "' guardado ");
                this.isopen = true;
            }
        }
    }

    /* Actualiza nuevo registro al final de la lista
     72  * input: String de la forma "campo1,campo2,campo3"
     73  */
    public boolean Actualizar_cliente(String texto) {
        //Si existe archivo abierto
        if (this.file != null) {
            System.out.println(this.file);
            if (escribir_si_no_existe(this.file, texto)) {
                return true;
            }
        } else //sino crear nuevo archivo
        {
            GuardarComo(texto);
        }
        return false;
    }

    public void Actualizar(String texto) {
        //Si existe archivo abierto
        if (this.file != null) {
            System.out.println(this.file);
            if (escribir(this.file, texto)) {
                JOptionPane.showMessageDialog(null, "Archivo '" + this.file.getName() + "' actualizado ");
            }
        } else //sino crear nuevo archivo
        {
            GuardarComo(texto);
        }
    }

    /* Muestra la ventana de dialogo Abrir archivo
     91  */
    public void Abrir(String nombreServer) {
        try {
            File archivo = new File("Servidores/" + nombreServer);
            this.file = archivo;
            leer(file);


        } catch (Exception ex) {
        }
    }

    public boolean Vefif_usuario(String nombreUsuario, String nombreServidor) {
        Abrir(nombreServidor);
        if (leer_archivo(file, nombreUsuario)) {
            return true;
        } else {
            return false;
        }

    }

    public boolean leer_archivo(File fichero, String name) {

        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(fichero));
            this.contenido.clear();
            String linea;
            while ((linea = reader.readLine()) != null) {
                this.contenido.add(linea);
                if (contenido.get(contenido.size() - 1).equals(name)) {
                    return true;
                }
            }
            //muestra el primer registro en la interfaz
            // Siguiente();
        } catch (IOException ex) {
            System.out.println("Error: " + ex);
        } finally {
            try {
                reader.close();
            } catch (IOException ex) {
                System.out.println("Error: " + ex);
            }
        }
        return false;
    }
    /* Función que escribe un registro en el archivo de texto
     * Si el archivo ya contaba con registros re-escribe estos y al final
     * escribe el nuevo registro
     */

    private boolean escribir_si_no_existe(File fichero, String texto) {
        boolean res = true;
        PrintWriter writer = null;
        try {
            String f = fichero.toString();
            //verifica que extension exista sino lo agrega
            if (!f.substring(f.length() - 4, f.length()).equals(".txt")) {
                f = f + ".txt";
                fichero = new File(f);
            }
            writer = new PrintWriter(fichero);
            //si hay un archivo abierto
            if (this.isopen) {   //añade primero linea por linea conenido anterior
                Iterator It = contenido.iterator();
                for (int i = 0; i < contenido.size(); i++) {
                    String ss = (String) contenido.get(i);
                    if (ss.equals(texto)) {
                        res = false;
                    }
                    writer.println(ss);
                }
                //se añade fila de texto al archivo
                if (res == true) {
                    writer.println(texto);
                    this.contenido.add(texto);
                }

            } else //esta guardando por primera vez
            {
                this.contenido.add(texto);
                writer.println(texto);
            }
            this.file = fichero;
            writer.close();
        } catch (FileNotFoundException ex) {
            System.out.println("Error:" + ex);
        } finally {
            writer.close();
        }
        return res;
    }

    private boolean escribir(File fichero, String texto) {
        boolean res = false;
        PrintWriter writer = null;
        try {
            String f = fichero.toString();
            //verifica que extension exista sino lo agrega
            if (!f.substring(f.length() - 4, f.length()).equals(".txt")) {
                f = f + ".txt";
                fichero = new File(f);
            }
            writer = new PrintWriter(fichero);
            //si hay un archivo abierto
            if (this.isopen) {   //añade primero linea por linea conenido anterior
                Iterator It = contenido.iterator();
                while (It.hasNext()) {
                    writer.println(It.next());
                }
                //se añade fila de texto al archivo
                writer.println(texto);
                this.contenido.add(texto);
            } else //esta guardando por primera vez
            {
                this.contenido.add(texto);
                writer.println(texto);
            }
            this.file = fichero;
            writer.close();
            res = true;
        } catch (FileNotFoundException ex) {
            System.out.println("Error:" + ex);
        } finally {
            writer.close();
        }
        return res;
    }

    /* Lee linea por linea un archivo de texto y almacena los registros
     * en un ArrayList segun orden de lectura
     * input: File
     */
    public boolean leer(File fichero) {

        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(fichero));
            this.contenido.clear();
            String linea;
            while ((linea = reader.readLine()) != null) {
                this.contenido.add(linea);
            }
            return true;
        } catch (IOException ex) {
            System.out.println("Error: " + ex);
        } finally {
            try {
                reader.close();
            } catch (IOException ex) {
                System.out.println("Error: " + ex);
            }
        }
        return false;
    }

    public ArrayList<String> getServers() {
        ArrayList<String> servers = new ArrayList<String>();
        String rutaServers = "Servidores";
        File f = new File(rutaServers);

        File[] ficheros = f.listFiles();
        for (int i = 0; i < ficheros.length; i++) {
            servers.add(ficheros[i].getName());
        }

        return servers;
    }
}